package cn.iocoder.yudao.module.cms.keyword.service;

import cn.iocoder.yudao.framework.common.pojo.PageResult;
import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
import cn.iocoder.yudao.module.cms.keyword.dal.dataobject.KeywordDO;
import cn.iocoder.yudao.module.cms.keyword.dal.mysql.KeywordMapper;
import cn.iocoder.yudao.module.cms.keyword.vo.AdminKeywordSaveReqVO;
import cn.iocoder.yudao.module.cms.keyword.vo.KeywordPageReqVO;
import cn.iocoder.yudao.module.cms.keyword.vo.KeywordSaveReqVO;
import jakarta.annotation.Resource;
import org.springframework.stereotype.Service;
import org.springframework.validation.annotation.Validated;

import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception;
import static cn.iocoder.yudao.module.api.cms.ErrorCodeConstants.KEYWORD_DUPLICATE;
import static cn.iocoder.yudao.module.api.cms.ErrorCodeConstants.KEYWORD_NOT_EXISTS;

/**
 * 搜索词 Service 实现类
 *
 * @author 山野羡民（1032694760@qq.com）
 */
@Service
@Validated
public class KeywordServiceImpl implements KeywordService {

    @Resource
    private KeywordMapper keywordMapper;

    @Override
    public Long createKeyword(AdminKeywordSaveReqVO createReqVO) {
        KeywordDO keywordDO = getKeywordByTypeAndContent(createReqVO.getType(), createReqVO.getContent());
        if (keywordDO != null) {
            throw exception(KEYWORD_DUPLICATE);
        }
        // 插入
        KeywordDO keyword = BeanUtils.toBean(createReqVO, KeywordDO.class);
        keywordMapper.insert(keyword);
        // 返回
        return keyword.getId();
    }

    @Override
    public void updateKeyword(AdminKeywordSaveReqVO updateReqVO) {
        KeywordDO keywordDO = validateKeywordExists(updateReqVO.getId());
        keywordDO.setType(updateReqVO.getType());
        keywordDO.setUrl(updateReqVO.getUrl());
        keywordDO.setIsHot(updateReqVO.getIsHot());
        keywordDO.setSort(updateReqVO.getSort());
        keywordMapper.updateById(keywordDO);
    }

    @Override
    public void saveKeyword(KeywordSaveReqVO updateReqVO) {
        KeywordDO keyword = BeanUtils.toBean(updateReqVO, KeywordDO.class);
        // 校验存在
        KeywordDO keywordDO = getKeywordByTypeAndContent(updateReqVO.getType(), updateReqVO.getContent());
        if (keywordDO == null) {
            keyword.setCount(1);
            keywordMapper.insert(keyword);
            return;
        }
        // 更新
        keyword.setId(keywordDO.getId());
        keyword.setCount(keywordDO.getCount() + 1);
        keywordMapper.updateById(keyword);
    }

    @Override
    public void deleteKeyword(Long id) {
        // 校验存在
        validateKeywordExists(id);
        // 删除
        keywordMapper.deleteById(id);
    }

    private KeywordDO getKeywordByTypeAndContent(String type, String keyword) {
        return keywordMapper.selectOne(KeywordDO::getType, type, KeywordDO::getContent, keyword);
    }

    private KeywordDO validateKeywordExists(Long id) {
        KeywordDO keywordDO = keywordMapper.selectById(id);
        if (keywordDO == null) {
            throw exception(KEYWORD_NOT_EXISTS);
        }
        return keywordDO;
    }

    @Override
    public KeywordDO getKeyword(Long id) {
        return keywordMapper.selectById(id);
    }

    @Override
    public PageResult<KeywordDO> getKeywordPage(KeywordPageReqVO pageReqVO) {
        return keywordMapper.selectPage(pageReqVO);
    }

}
